package com.abc.deviceservice.pinpad;

//密码键盘设备用于提供客户密码（PIN）安全输入的功能。如果设备没有密码键盘，在获取此对象的方法返回空。
public interface IPinpad {

    /**
     * 获取密钥状态
     * 获取外设当前各类密钥的状态，用于判断是否进行过相关密钥的获取及灌注，需要以异步的方式回调
     * @param timeOut 超时时间 单位:毫秒
     * @param listener 回调返回密钥状态信息，回调详细说明如下：
     *     返回获取到的密钥状态信息通过 onResult 回调返回 String 类型的 data 参数，为 json 格式的字
     *     符串：
     *     GuoJiMainKey：国际算法主秘钥状态
     *     GuoMiMainKey：国密算法主秘钥状态
     *     GuoJiWorkKey：国际算法工作秘钥状态
     *     GuoMiWorkKey：国密算法工作秘钥状态
     *     0-没有，1-有。
     *     如{"GuoJiMainKey" : "1", "GuoMiMainKey" : "1", "GuoJiWorkKey" : "1", "GuoMiWorkKey" : "1"} 代表设备内既灌注过国际算法主秘钥和工作密钥，
     *     也灌注过国密算法主秘钥和工作密钥。
     */
    void getKeyStatus(int timeOut, IPinpadListener listener);

    /**
     * 装载主密钥
     * @param content 主密钥用 public key 加密后的密文
     *                国际算法：主密钥为 DES 算法的密钥(自行判断是 DES或 3DES) ；
     *                国密算法：主秘钥为 SM4 算法的密钥，
     *                后续处理主秘钥密文时，C1 64 位 ；C3 32 位；C2 余下的数据。
     *                排列顺序 C1 C2 C3 改为 C1 C3 C2。
     * @param code 主密钥索引号（写死 0）
     * @param cipherType 加密类型（1=国际，2=国密）
     * @param timeOut 超时时间 单位:毫秒
     * @param listener 回调返回公钥信息，成功回调,data可以为空：
     */
    void loadMainKey(String content, int code, int cipherType, int timeOut, IPinpadListener listener);

    /**
     * 装载工作密钥
     * @param PIKcontent 工作密钥
     * @param MAKcontent 计算 mac 密钥
     * @param DEKcontent 其他密钥
     * @param mainKeyCode 主密钥索引（写死 0）
     * @param cipherType 加密类型（1=国际，2=国密）
     * @param timeOut 超时时间 单位:毫秒
     * @param listener 回调返回密钥状态信息，回调详细说明如下：
     *     data 需返回用 PIK 加密结果，后续会对其进行校验
     *     国际算法- 加密 8 个 0x00
     *     国密算法- 加密 16 个 0x00
     */
    void loadWorkKey(String PIKcontent, String MAKcontent, String DEKcontent, int mainKeyCode, int cipherType, int timeOut, IPinpadListener listener);

    /**
     * 开启密码输入
     * @param inputTimes 输入密码次数(1：表示只需要输入一次，2表示需要输入两次，底座校验两次输入是否一致，不一致则回调 onError 方法）
     * @param bankCardNo 银行卡卡号
     * @param cipherType 加密类型（1=国际，2=国密）
     * @param timeOut -超时时间 单位:毫秒 （从调起到用户点确认按钮的时间）
     * @param listener 回调返回密钥状态信息，回调详细说明如下：
     *                 当用户点击确认或数字按键时被调用，超过 6 位按数字键无反应。
     *                 通过 option 参数控制当前密码输入的状态；
     *                 option=”0”，用户点击确认时,代表用户输入完成，应用根据接口返回的
     *                 data 值获取输入的密码；
     *                 option=”1”，代表正在输入，外设接口应返回目前已经输入的位数length；
     *                 例如已经输入了 6 位，则返回{“option”:”1”, ”length”:6}
     *                 点击确认后则返回{“option”:”0”, ”data”:”密码密文”};
     * @param prompt true:有提示音和动画 false: 无提示音无动
     * 画
     */
    void getPin(int inputTimes, String bankCardNo, int cipherType, int timeOut, IPinpadListener listener, boolean prompt);

    /**
     * 获取公钥信息
     * 获取设备生成的公钥信息，每次新生成一对公私秘钥对，需要以异步的方式回调
     * @param cipherType 加密类型（1=国际，2=国密）
     * @param timeOut 超时时间 单位:毫秒
     * @param listener 回调返回公钥信息，回调详细说明如下：
     *      在onResult方法中返回获取到的公钥信息{“data”:”公钥值”}
     *      RSA 算法公钥需使用 DER 格式，固定 30 开头
     *      SM2 算法公钥不需要 DER 格式，需要固定 04 开头非压缩格式
     */
    void getPublicKey(int cipherType, int timeOut, IPinpadListener listener);

    /**
     * 初始化，清空所有密钥
     * @return 字符串类型，成功为 true,失败为 false
     */
    String resetKey();

}
